public class code02 {
//    力扣 150 全排列
public List<List<Integer>> permute(int[] nums) {
    // 这道题目的要求是数组的全排列实现
    // 首先，先来创建一个用于存储返回数据的链表
    List<List<Integer>> re = new ArrayList<>();

    // 先来排除一个特殊情况
    if(nums.length <= 0) {
        return re;
    }

    // 创建一个列表，先来将当前的数组全部存储起来
    // (这里主要是要使用列表的 swap 方法来对数据进行交换存储)
    // 在这种情况下不需要开辟额外地址空间
    List<Integer> output = new ArrayList<>();
    for(int n : nums) {
        output.add(n);
    }

    int len = nums.length;
    // 这里实现一个外部方法进行递归操作
    fun(len, output, re, 0);

    return re;
}

    // 简单介绍这里传入的参数
    // 数组长度
    // 变换数组和返回数组
    // 数组下标的起始位置
    private void fun(int n, List<Integer> output, List<List<Integer>> re, int start) {
        // 首先确定递归返回值
        if(start == n) {
            // 当起始点和 数组长度 相同时，此时就说明这一轮递归的顺序调整已经完成
            // 此时就需要将值存储起来
            re.add(new ArrayList<>(output));
        }

        // 通过 for 循环，让每一个数组下标都作为一次交换点
        // 因为这里是数组下标，所以 i 是不能等于 n 的
        for(int i = start; i < n; i++) {
            // 动态的维护数组
            // 这个 swap 是java库中提供的一个交换链表元素的静态方法
            Collections.swap(output, start, i);

            // 交换结束后
            // 此时进行递归 从新调整 start 起始点
            fun(n, output, re, start + 1);

            // 在当前本次递归结束后，需要将 start 位置上的值和 i 位置上的值调整回去
            Collections.swap(output, start, i);
        }
    }
}
